const fs = require('fs');
const path = require('path');
const mysql = require('mysql2/promise');
const readline = require('readline');
const { execSync } = require('child_process');
const crypto = require('crypto');

// 创建交互式命令行接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// 提示用户输入
const prompt = (query) => new Promise((resolve) => rl.question(query, resolve));

async function main() {
  console.log('====== bot_web MySQL 安装工具 ======');
  console.log('这个工具将帮助你将项目从Supabase迁移到MySQL数据库');
  console.log('请确保已经安装了MySQL数据库服务器\n');

  try {
    // 检查是否已安装必要的npm包
    console.log('检查依赖...');
    try {
      require.resolve('mysql2');
      require.resolve('jsonwebtoken');
      require.resolve('bcrypt');
      require.resolve('uuid');
    } catch (e) {
      console.log('正在安装必要的依赖...');
      execSync('npm install mysql2 jsonwebtoken bcrypt uuid dotenv', { stdio: 'inherit' });
    }

    // 获取数据库连接信息
    const host = await prompt('MySQL主机地址 (默认: localhost): ') || 'localhost';
    const port = await prompt('MySQL端口 (默认: 3306): ') || '3306';
    const user = await prompt('MySQL用户名 (默认: root): ') || 'root';
    const password = await prompt('MySQL密码: ');
    const database = await prompt('数据库名称 (默认: bot_web): ') || 'bot_web';
    const jwt_secret = crypto.randomBytes(32).toString('hex');

    // 创建MySQL连接
    const connection = await mysql.createConnection({
      host,
      port: parseInt(port),
      user,
      password
    });

    // 创建数据库（如果不存在）
    console.log(`\n创建数据库 ${database}...`);
    await connection.query(`CREATE DATABASE IF NOT EXISTS ${database}`);
    
    // 切换到新创建的数据库
    await connection.query(`USE ${database}`);
    console.log(`数据库 ${database} 创建成功`);

    // 创建目录结构（如果不存在）
    console.log('\n创建必要的目录结构...');
    const dirs = [
      './server/lib',
      './server/routes',
      './server/services',
      './server/migrations'
    ];

    for (const dir of dirs) {
      if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir, { recursive: true });
      }
    }

    // 创建 .env 文件
    console.log('\n创建 .env 文件...');
    const envContent = `MYSQL_HOST=${host}
MYSQL_PORT=${port}
MYSQL_USER=${user}
MYSQL_PASSWORD=${password}
MYSQL_DATABASE=${database}
JWT_SECRET=${jwt_secret}`;

    fs.writeFileSync('.env', envContent);
    console.log('.env 文件创建成功');

    // 执行数据库迁移
    console.log('\n正在配置数据库...');
    const migrationDir = path.join(__dirname, 'server', 'migrations');
    
    // 复制migrations目录中的create_tables.sql文件到临时文件
    if (!fs.existsSync(path.join(migrationDir, 'create_tables.sql'))) {
      console.error('错误: 找不到 server/migrations/create_tables.sql 文件');
      process.exit(1);
    }

    const sqlScript = fs.readFileSync(path.join(migrationDir, 'create_tables.sql'), 'utf8');
    const statements = sqlScript.split(';').filter(stmt => stmt.trim());

    for (const statement of statements) {
      if (statement.trim()) {
        await connection.query(statement + ';');
      }
    }

    console.log('数据库表创建成功');

    // 添加初始管理员用户
    const adminEmail = await prompt('管理员邮箱 (默认: admin@example.com): ') || 'admin@example.com';
    const adminPassword = await prompt('管理员密码 (默认: admin123): ') || 'admin123';
    const adminUsername = await prompt('管理员用户名 (默认: Admin): ') || 'Admin';
    
    // 导入bcrypt进行密码哈希
    const bcrypt = require('bcrypt');
    const hashedPassword = await bcrypt.hash(adminPassword, 10);
    
    const { v4: uuidv4 } = require('uuid');
    const adminId = uuidv4();

    // 插入管理员用户
    await connection.query(`
      INSERT INTO users (id, email, password, username, role, created_at, updated_at)
      VALUES (?, ?, ?, ?, 'admin', NOW(), NOW())
    `, [adminId, adminEmail, hashedPassword, adminUsername]);

    console.log('\n管理员用户创建成功');
    console.log(`- 邮箱: ${adminEmail}`);
    console.log(`- 密码: ${adminPassword}`);
    console.log(`- 用户ID: ${adminId}`);

    // 关闭数据库连接
    await connection.end();

    console.log('\n====== 安装完成 ======');
    console.log('MySQL数据库配置成功！');
    console.log('\n启动服务:');
    console.log('1. 前端: npm run dev');
    console.log('2. 后端: cd server && node wss-service.js');

  } catch (error) {
    console.error('安装过程中出错:', error);
  } finally {
    rl.close();
  }
}

main(); 